package br.ucb.cesbdao.persistencia.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import br.ucb.cesbdao.beans.Pessoa;
import br.ucb.cesbdao.persistencia.AbstractConnectionDAO;


public class PessoaDAO extends AbstractConnectionDAO{

	public PessoaDAO(Connection con) {
		super(con);
	}

	public int addPessoa(Pessoa pessoa) throws SQLException, ClassNotFoundException{
		String sql="INSERT INTO daoPessoa VALUES(null,?,?,?)";
		PreparedStatement instrucao = getConexao().prepareStatement(sql);
		instrucao.setString(1, pessoa.getNome());
		instrucao.setString(2, String.valueOf(pessoa.getSexo()));
		instrucao.setString(3, String.valueOf(pessoa.getStatus()));
		int retorno = instrucao.executeUpdate(); 
		instrucao.close();
		getConexao().close();
		return retorno;
	}


	public  ArrayList<Pessoa> listaPessoa() throws SQLException,ClassNotFoundException{
		String sqlConsulta = "SELECT * FROM daoPessoa WHERE chavePessoa > 0 ORDER BY nomePessoa ";
		Statement instrucao=getConexao().prepareStatement(sqlConsulta);
		ResultSet rs=instrucao.executeQuery(sqlConsulta);
		ArrayList<Pessoa> pessoas = new ArrayList<Pessoa>();
		while(rs.next())
			pessoas.add(new Pessoa(rs.getInt("chavePessoa"), rs.getString("nomePessoa"),(rs.getString("sexo")).charAt(0), rs.getString("status").charAt(0)));
		instrucao.close();
		rs.close();
		getConexao().close();
		return pessoas;
	}

	public  ArrayList<Pessoa> consultaPessoaByTipo(String tipo) throws SQLException,ClassNotFoundException{
		String sqlConsulta = "select * from daopessoa where daopessoa.chavepessoa not in (SELECT p.chavePessoa FROM daoTrabalhador T, daoPessoa P WHERE T.chavePessoa = P.chavePessoa AND P.chavePessoa > 0 AND T.tipo = ?) ORDER BY nomePessoa;";
		PreparedStatement instrucao=getConexao().prepareStatement(sqlConsulta);
		instrucao.setString(1,tipo);
		ResultSet rs=instrucao.executeQuery();
		ArrayList<Pessoa> pessoas = new ArrayList<Pessoa>();
		while(rs.next())
			pessoas.add(new Pessoa(rs.getInt("chavePessoa"), rs.getString("nomePessoa"),(rs.getString("sexo")).charAt(0), rs.getString("status").charAt(0)));
		instrucao.close();
		rs.close();
		getConexao().close();
		return pessoas;
	}

	public  ArrayList<Pessoa> consultaPessoaAtiva() throws SQLException,ClassNotFoundException{
		String sqlConsultaByStatus = "SELECT * FROM daoPessoa WHERE status = 'A' AND chavePessoa > 0 ORDER BY nomePessoa";
		Statement instrucao=getConexao().prepareStatement(sqlConsultaByStatus);
		ResultSet rs=instrucao.executeQuery(sqlConsultaByStatus);
		ArrayList<Pessoa> pessoas = new ArrayList<Pessoa>();
		while(rs.next())
			pessoas.add(new Pessoa(rs.getInt("chavePessoa"), rs.getString("nomePessoa"),(rs.getString("sexo")).charAt(0),rs.getString("status").charAt(0)));
		instrucao.close();
		rs.close();
		getConexao().close();
		return pessoas;
	}

	public  ArrayList<Pessoa> consultaPessoaByNome(String nome) throws SQLException,ClassNotFoundException{
		String sqlConsultaByNome = "SELECT * FROM daoPessoa WHERE chavePessoa > 0 AND nomePessoa LIKE ";
		sqlConsultaByNome=sqlConsultaByNome+"'%"+nome+"%'";
		Statement instrucao=getConexao().prepareStatement(sqlConsultaByNome);
		ResultSet rs=instrucao.executeQuery(sqlConsultaByNome);
		ArrayList<Pessoa> pessoas = new ArrayList<Pessoa>();
		while(rs.next())
			pessoas.add(new Pessoa(rs.getInt("chavePessoa"), rs.getString("nomePessoa"), (rs.getString("sexo")).charAt(0),rs.getString("status").charAt(0)));
		instrucao.close();
		rs.close();
		getConexao().close();
		return pessoas;
	}
	
	public  ArrayList<Pessoa> consultaPessoaByNomeTipo(String nome,String tipo) throws SQLException,ClassNotFoundException{
		String sqlConsultaByNome = "select * from daopessoa where daopessoa.chavepessoa not in (SELECT p.chavePessoa FROM daoTrabalhador T, daoPessoa P WHERE T.chavePessoa = P.chavePessoa AND P.chavePessoa > 0 AND T.tipo = ?) AND nomePessoa LIKE '%"+nome+"%' ORDER BY nomePessoa;";
		PreparedStatement instrucao=getConexao().prepareStatement(sqlConsultaByNome);
		instrucao.setString(1, tipo);
		ResultSet rs=instrucao.executeQuery();
		ArrayList<Pessoa> pessoas = new ArrayList<Pessoa>();
		while(rs.next())
			pessoas.add(new Pessoa(rs.getInt("chavePessoa"), rs.getString("nomePessoa"), (rs.getString("sexo")).charAt(0),rs.getString("status").charAt(0)));
		instrucao.close();
		rs.close();
		getConexao().close();
		return pessoas;
	}


	public  Pessoa consultaPessoaByCpf(String cpf) throws SQLException, ClassNotFoundException{		
		String sqlConsultaByCpf="SELECT * FROM daoPessoa WHERE cpf = ?";
		PreparedStatement instrucao= getConexao().prepareStatement(sqlConsultaByCpf);
		instrucao.setString(1, cpf);
		ResultSet rs= instrucao.executeQuery();
		Pessoa pessoa = null;
		if(rs.first())
			pessoa = new Pessoa(rs.getInt("chavePessoa"), rs.getString("nomePessoa"),(rs.getString("sexo")).charAt(0),rs.getString("status").charAt(0));
		instrucao.close();
		rs.close();
		getConexao().close();
		return pessoa;	
	}
	

	public  Pessoa consultaPessoaById(int id) throws SQLException,ClassNotFoundException{
		String sqlConsultaId = "SELECT * FROM daoPessoa WHERE chavePessoa = ?";
		PreparedStatement instrucao=getConexao().prepareStatement(sqlConsultaId);
		instrucao.setInt(1, id);
		ResultSet rs=instrucao.executeQuery();
		Pessoa pessoa =null;
		if(rs.first())
			pessoa=(new Pessoa(rs.getInt("chavePessoa"), rs.getString("nomePessoa"), (rs.getString("sexo")).charAt(0),rs.getString("status").charAt(0)));
		instrucao.close();
		rs.close();
		getConexao().close();
		return pessoa;
	}

	public  int alteraStatusPessoa(char status, int id) throws SQLException, ClassNotFoundException{
		String sql="UPDATE daoPessoa SET status=? WHERE chavePessoa = ?";
		PreparedStatement instrucao=getConexao().prepareStatement(sql);
		instrucao.setString(1,String.valueOf(status));
		instrucao.setInt(2, id);
		int sucesso=instrucao.executeUpdate();
		instrucao.close();
		getConexao().close();
		return sucesso;
	}

	public  boolean deletaPessoa(int id) throws SQLException, ClassNotFoundException {
		String sql="DELETE FROM daoPessoa WHERE chavePessoa = ?";
		PreparedStatement instrucao=getConexao().prepareStatement(sql);
		instrucao.setInt(1, id);
		boolean sucesso=instrucao.execute();
		instrucao.close();
		getConexao().close();
		return sucesso;
	}

	public  int alteraPessoa (Pessoa pessoa) throws SQLException, ClassNotFoundException{
		String sql="UPDATE daoPessoa SET nomePessoa = ?,sexo = ?, status = ? WHERE chavePessoa = ?";
		PreparedStatement instrucao=getConexao().prepareStatement(sql);
		instrucao.setString(1, pessoa.getNome());
		instrucao.setString(2, String.valueOf(pessoa.getSexo()));
		instrucao.setString(3,String.valueOf(pessoa.getStatus()));
		instrucao.setInt(4, pessoa.getId());
		int sucesso=instrucao.executeUpdate();
		instrucao.close();
		getConexao().close();
		return sucesso;
	}

	public  boolean alteraPessoaNomeSexo (Pessoa pessoa,int id) throws SQLException, ClassNotFoundException{
		String sql="UPDATE daoPessoa SET nomePessoa = ?,sexo = ? WHERE chavePessoa = ?";
		PreparedStatement instrucao=getConexao().prepareStatement(sql);
		instrucao.setString(1, pessoa.getNome());
		instrucao.setString(2, String.valueOf(pessoa.getSexo()));
		instrucao.setInt(3, id);
		instrucao.executeUpdate();
		instrucao.close();
		getConexao().close();
		return true;
	}


	public  ArrayList<Pessoa> consultaPessoaBySexoNome(String nome, String sexo) throws ClassNotFoundException, SQLException {
		String sqlConsultaByNomeSexo = "SELECT * FROM daoPessoa WHERE chavePessoa > 0 AND sexo = ? AND nomePessoa LIKE ?";
		PreparedStatement stm=getConexao().prepareStatement(sqlConsultaByNomeSexo);
		stm.setString(2,"%"+nome+"%");
		stm.setString(1,sexo);

		ResultSet rs = stm.executeQuery();
		ArrayList<Pessoa> pessoas = new ArrayList<Pessoa>();
		while(rs.next())
			pessoas.add(new Pessoa(rs.getInt("chavePessoa"), rs.getString("nomePessoa"), (rs.getString("sexo")).charAt(0),rs.getString("status").charAt(0)));
		stm.close();
		rs.close();
		getConexao().close();
		return pessoas;
	}

}
